package app;

import java.sql.*;
import java.util.Properties;
import java.util.regex.Pattern;

/**
 * 此类为数据库工具类
 * 功能有返回连接对象（通过MySQL用户直接操作），关闭连接，操作对象和结果集。检测用户是否存在，检测用户密码是否正确，创建用户
 * 在其他电脑上使用可能要改user和rootPassword为本地的mysql管理者用户的用户名和密码
 *
 */
public class DBTool {
    private static String driver;
    private static String url;
    private static String user;
    private static String rootPassword;
    private static String usersInfo;
    private static String dataOfSongs;
    private static Properties properties = null;
    //类加载时注册驱动,获取mysql相关信息
    static {
        properties = new Properties();
        try {
            properties.load(DBTool.class.getResourceAsStream("/MusicPlayerDB.properties"));
            driver = properties.getProperty("DRIVER");
            url = properties.getProperty("URL");
            user = properties.getProperty("ROOTUSER");
            rootPassword = properties.getProperty("ROOTPASSWORD");
            usersInfo = properties.getProperty("USERSINFO");
            dataOfSongs = properties.getProperty("DATAOFSONGS");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            Class.forName(properties.getProperty("DRIVER"));
        } catch (Exception e){
            e.printStackTrace();
        }


    }

    /**
     *获取连接对象
     */
    public static Connection getConnection(String userName) throws SQLException {
        String URL = url + userName;
        return DriverManager.getConnection(URL,user,rootPassword);
    }

    /**
     * 关闭与数据库的连接
     * @param con 连接对象
     * @param ps  操作对象
     * @param rs  结果集
     */
    public static void Close(Connection con,PreparedStatement ps,ResultSet rs){
        try{
            if(con != null) con.close();
            if(ps != null) ps.close();
            if(rs != null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 检查账户是否存在
     * 此类对传入的用户名进行检查,查看是否有这样一个用户
     * @param userName 传入用户名
     * @return 返回为真：该账户存在;返回为假：该账户不存在
     */
    public static boolean isAccountExist(String userName) throws SQLException {
        //返回值
        boolean isExist = false;
        //在这里创建内部的连接对象，操作对象和结果集
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取连接对象
            con = DriverManager.getConnection(url,user,rootPassword);
            //SQL语句
            String sql = "select * from users.Info where user = ?";
            //预编译SQL语句
            ps = con.prepareStatement(sql);
            //给占位符?传值（问号下标从1开始）
            ps.setString(1,userName);
            //执行sql
            rs = ps.executeQuery();
            //处理结果集
            while (rs.next()){
                isExist = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(rs!=null) rs.close();
            if(ps!=null) ps.close();
            if(con!=null) con.close();
        }
        return isExist;
    }

    /**
     * 检查用户名和密码是否正确
     * 对用户输入的用户名和密码就行检查，查看是否能够与数据库成功建立连接
     * @param userName  用户名
     * @param password  密码
     * @return 返回为真：用户名密码正确；返回为假：用户名密码有误
     */
    public static boolean isAccessible (String userName, String password ) throws SQLException {
        //返回值
        boolean isAccessible = false;
        //在这里创建内部的连接对象，操作对象和结果集
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //获取连接对象
            con = DriverManager.getConnection(url,user,rootPassword);
            //SQL语句
            String sql = "select * from users.info where user = ? and password = ?";
            ps = con.prepareStatement(sql);
            ps.setString(1,userName);
            ps.setString(2,password);
            rs = ps.executeQuery();
            while(rs.next()) {
                isAccessible = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(rs!=null) rs.close();
            if(ps!=null) ps.close();
            if(con!=null) con.close();
        }
        return isAccessible;
    }

    /**
     * 通过输入的用户名和密码来创建新用户
     * @param userName 用户名
     * @param password 密码
     * @return 返回值为真：用户创建成功；返回值为假：用户创建失败（可能是因为用户已经存在）
     */
    public static boolean createAccount(String userName, String password) throws SQLException {
        //返回值
        boolean isSucceed = false;
        //在这里创建内部的连接对象和操作对象
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        //如果用户不存在，添加用户信息
        if ( !isAccountExist(userName) ){
            try {
                //用管理者账户与数据库获取连接
                con = DriverManager.getConnection(url,user,rootPassword);
                //SQL语句
                String sql = "insert into " + usersInfo + " set user = ?, password = ?";
                ps = con.prepareStatement(sql);
                ps.setString(1,userName);
                ps.setString(2,password);
                ps.execute();
                String sql1 = "select * from " + usersInfo + " where user = ? and password = ?";
                ps = con.prepareStatement(sql1);
                ps.setString(1,userName);
                ps.setString(2,password);
                rs = ps.executeQuery();
                while(rs.next()) {
                    isSucceed = true;
                    //在用户添加成功后为其创造一个数据库，数据库名与用户名相同
                    if(isSucceed){
                        String sql2 = "CREATE DATABASE " + userName +" CHARACTER SET utf8 COLLATE utf8_general_ci";
                        ps = con.prepareStatement(sql2);
                        ps.execute();
                        //在用户使用的数据库中再添加一个默认的表（默认歌单）
                        String sql3 = "create table " + userName + ".DefaultList select * from " + dataOfSongs;
                            ps = con.prepareStatement(sql3);
                            ps.execute();
                    }
                }
            } catch (Exception e){
                e.printStackTrace();
            } finally {
                if(rs != null) rs.close();
                if(ps != null) ps.close();
                if(con != null) con.close();
            }
        } else {
//            System.out.println("用户已存在");
        }
        return isSucceed;
    }
    
}
